#include "ssl_wrapper.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

static int ssl_initialized = 0;

// 初始化SSL库
int init_openssl_engine(void)
{
    if (ssl_initialized)
    {
        return 1; // 已经初始化过
    }

    // 初始化OpenSSL
    SSL_library_init();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();

    // 注意：无需调用gmssl_library_init()，GmSSL API可以直接使用

    ssl_initialized = 1;
    return 1;
}

// 清理SSL资源
void cleanup_openssl(void)
{
    if (!ssl_initialized)
    {
        return;
    }

    // 清理OpenSSL资源
    ERR_free_strings();
    EVP_cleanup();

    // 注意：无需调用gmssl_library_cleanup()，GmSSL API可以直接使用

    ssl_initialized = 0;
}

// 创建SSL上下文
SSL_CTX *create_ssl_context(int is_server)
{
    const SSL_METHOD *method;
    SSL_CTX *ctx;

    if (is_server)
    {
        method = SSLv23_server_method();
    }
    else
    {
        method = SSLv23_client_method();
    }

    ctx = SSL_CTX_new(method);
    if (!ctx)
    {
        perror("无法创建SSL上下文");
        ERR_print_errors_fp(stderr);
        return NULL;
    }

    // 设置安全选项
    SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);

    return ctx;
}

// 为套接字设置SSL
SSL *setup_ssl_for_socket(SSL_CTX *ctx, int sock)
{
    SSL *ssl;

    ssl = SSL_new(ctx);
    if (!ssl)
    {
        perror("无法创建SSL结构");
        ERR_print_errors_fp(stderr);
        return NULL;
    }

    if (SSL_set_fd(ssl, sock) != 1)
    {
        perror("无法设置SSL文件描述符");
        ERR_print_errors_fp(stderr);
        SSL_free(ssl);
        return NULL;
    }

    return ssl;
}

// 关闭SSL连接
void ssl_close(SSL *ssl)
{
    if (ssl)
    {
        SSL_shutdown(ssl);
        SSL_free(ssl);
    }
}

// 安全地发送数据
int ssl_send(SSL *ssl, const void *buf, int len)
{
    int ret;

    if (!ssl || !buf || len <= 0)
    {
        return -1;
    }

    ret = SSL_write(ssl, buf, len);
    if (ret <= 0)
    {
        int err = SSL_get_error(ssl, ret);
        fprintf(stderr, "SSL写入错误: %d\n", err);
        ERR_print_errors_fp(stderr);
        return -1;
    }

    return ret;
}

// 安全地接收数据
int ssl_recv(SSL *ssl, void *buf, int len)
{
    int ret;

    if (!ssl || !buf || len <= 0)
    {
        return -1;
    }

    ret = SSL_read(ssl, buf, len);
    if (ret <= 0)
    {
        int err = SSL_get_error(ssl, ret);
        // 避免在对端正常关闭连接时打印错误
        if (err != SSL_ERROR_ZERO_RETURN)
        {
            fprintf(stderr, "SSL读取错误: %d\n", err);
            ERR_print_errors_fp(stderr);
        }
        return -1;
    }

    return ret;
}

// 清理SSL上下文
void ssl_ctx_cleanup(SSL_CTX *ctx)
{
    if (ctx)
    {
        SSL_CTX_free(ctx);
    }
}